<?php

/**
 * DB 프로시저 관련 추상화 클래스 
 * 
 * @package php.db.proc
 */

/**
 * Cubrid 프로시저 
 * 
 * 
 * @author easylogic
 * @package php.db.proc
 *
 */
class CubridProc extends DBProc { 
	
	private $_statement;
	
	/**
	 * 생성자 
	 * 
	 * @param DBClient $connector
	 */
	public function __construct(DBClient $connector, $name = '', $option = array()) { 
		parent::__construct($connector, $name, $option);	
	}
	
	/**
	 * 프로시저 실행
	 * 
	 * @return bool 성공이면 true, 실패이면 false
	 */
	public function execute() {
		$conn = $this->getConnector();
	
		$output_count	= 0;
		$output_list	= array();

		// 문자열 결합 
		$head = "call {$this->_name}(";
		$temp = array();
		$var_init = array();
		$bind_init = array();

		// 바인딩 문자열 만들기 
		foreach (array_keys($this->_bind) as $key) { 

			// out, inout 변수이면 초기값 설정 
			if ($this->_bind[$key]['output'] == 'in') { 
				$bind_init[] = $this->_bind[$key];
			} else { 

				$var_init[] = sprintf("select %s into %s from db_root;", 
											$conn->getTypeString($this->_bind[$key]['type'], 
											$this->_bind[$key]['value']), 
											$this->_bind[$key]['name']
				);

			}

			// 프로시저 변수 설정 
			if ($this->_bind[$key]['output'] == 'in') { 
				$temp[]	= '?';
			} else {
				$temp[]	= $this->_bind[$key]['name'];
			}

			// out, inout 변수 이름 설정 
			if (in_array($this->_bind[$key]['output'], array('out', 'inout'))) { 
				$output_list[] = $this->_bind[$key]['name'];
			}
		}
		
		$head .= implode(",", $temp);

		$head .= ") ";


		// output 변수 선언 
		foreach ($var_init as $var_sql) { 
			$conn->query($var_sql);
		}

		// 프로시저 실행 
		$this->_statement = $conn->prepare($head);

		// 바인딩 
		foreach ($bind_init as $key => $value) { 
			$conn->bind($this->_statement, $key+1, $value['value'], $value['type']);
		}

		$this->_result = $conn->query($this->_statement);

		// output 변수 받기 
		if (count($output_list) > 0 ) { 
			$sql = "select ".implode(",", $output_list). " from db_root ";
			$data = $conn->getOne($sql);

			foreach ($output_list as $output_var) { 
				$this->_bind[$output_var]['value'] = $data->get($output_var);
			}
		}

		return true;

	
	}		
}
?>